package br.com.danieljr.crowdmap.basededados;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.os.Environment;
import android.util.Log;

public class BaseDadosArquivo implements IControladorBaseDados {

	private RandomAccessFile raf;
	private File file;
	private Date data;
	private String nome;

	public BaseDadosArquivo(String nome) {
		this.nome = nome;
	}

	@Override
	public void abrir() {
		// TODO Auto-generated method stub
		file = new File(Environment.getExternalStorageDirectory(), nome);
		try {
			raf = new RandomAccessFile(file, "rw");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			Log.d("BaseDadosArquivos", "Abrir finalizado");
		}
	}

	@Override
	public void fechar() {
		// TODO Auto-generated method stub
		try {
			raf.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void inserir(Dados dados) {
		// TODO Auto-generated method stub
		try {
			data = new Date();
			// formato da data
			SimpleDateFormat formatadorBrasil = new SimpleDateFormat(
					"dd-MM-yyyy HH:mm:ss");
			dados.setData(formatadorBrasil.format(data));
			// // string que irei escrever no arquivo
			// info =
			// dados.getOperadora()+" "+dados.getSinal()+" "+dados.getLatitude()+" "+dados.getLongitude()+" "+dados.getBateria()+" ";
			// info = info + formatadorBrasil.format(data);
			// // vou para o final do arquivo

			raf.seek(raf.length());

			raf.writeUTF(dados.getOperadora());
			raf.writeInt(dados.getSinal());
			raf.writeDouble(dados.getLatitude());
			raf.writeDouble(dados.getLongitude());
			raf.writeInt(dados.getBateria());
			raf.writeUTF(dados.getData());
			//
			// // escrevo no arquivo
			// raf.writeBytes(info + "\n");
			// // raf.writeUTF(info + "\n");

		} catch (Exception ex) {
			Log.e(ex.toString(), ex.getMessage());
		} finally {
			Log.d("BaseDadosArquivo", "Inserir finalizado");
		}
	}

	@Override
	public List<Dados> listarDados() {
		// TODO Auto-generated method stub

		List<Dados> lista = new ArrayList<Dados>();
		try {
			raf.seek(0);
			while (raf.getFilePointer() < raf.length()) {
				Dados dados = new Dados();
				dados.setOperadora(raf.readUTF());
				dados.setSinal(raf.readInt());
				dados.setLatitude(raf.readDouble());
				dados.setLongitude(raf.readDouble());
				dados.setBateria(raf.readInt());
				dados.setData(raf.readUTF());
				lista.add(dados);
			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.d("Base de Dados", "Deu merda no listar!");
		}
		return lista;
	}

	/* Checks if external storage is available for read and write */
	public static boolean isExternalStorageWritable() {
		String state = Environment.getExternalStorageState();
		if (Environment.MEDIA_MOUNTED.equals(state)) {
			return true;
		}
		return false;
	}

	/* Checks if external storage is available to at least read */
	public static boolean isExternalStorageReadable() {
		String state = Environment.getExternalStorageState();
		if (Environment.MEDIA_MOUNTED.equals(state)
				|| Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
			return true;
		}
		return false;
	}

}
